#include <iostream>
#include "BTree/BTree.h"
#include "BTree/RegistroDatos.h"
#include "BTreeUtils/TreePrinter.h"


using namespace std;


int main(int argc, char* argv[]){

	try{
		cout << "Prototipo MK-16 (v1)" << endl;

		cout << "\nSe crea un árbol B++ en disco" << endl;
		BTree tree("ArbolBpp.bin", true);

		cout << "Se cargan un par de palabras" << endl;
		tree.insertarRegistro(new RegistroDatos("registro", 1));
		tree.insertarRegistro(new RegistroDatos("arbolera", 66));
		tree.insertarRegistro(new RegistroDatos("arbol", 7));
		
		cout << "Se cargan mas palabras" << endl;
		tree.insertarRegistro(new RegistroDatos("cargar", 4));
		tree.insertarRegistro(new RegistroDatos("cesar", 9));
		tree.insertarRegistro(new RegistroDatos("capo", 3));
		tree.insertarRegistro(new RegistroDatos("fuerte", 8));

		cout << "Se cargan un monton de palabras!" << endl;
		tree.insertarRegistro(new RegistroDatos("botellero", 10));
		tree.insertarRegistro(new RegistroDatos("bicharachero", 15));
		tree.insertarRegistro(new RegistroDatos("zorro", 50));
		tree.insertarRegistro(new RegistroDatos("pepe", 25));
		tree.insertarRegistro(new RegistroDatos("maldito", 35));
		tree.insertarRegistro(new RegistroDatos("funciona", 20));
		tree.insertarRegistro(new RegistroDatos("gangnam", 5));

		cout << "\n//-------------------------------//" << endl;

		cout << "\nSe busca una de las palabras en el árbol B++:" << endl;

		RegistroDatos rBuscar;
		rBuscar.setClave("arbolera");
		RegistroDatos reg = tree.buscarRegistro(rBuscar);

		cout << "Se quiere buscar '" << rBuscar.getClave() << "'" << endl;
		if (reg.getPosEnDiccionario() != static_cast<unsigned>(-1)){

			cout << "Se encontró: " << reg.getClave()
					<< ", pos: " << reg.getPosEnDiccionario() << "." << endl;

		} else {
			cout << "No se encontró nada" << endl;
		}

		cout << "\n//-------------------------------//" << endl;

		cout << "\nSe hace una busqueda secuencial: " << endl;

		cout << "Se recupera el primer registro del árbol, deberia ser 'arbol'";
		RegistroDatos rSec = tree.proximoRegistroPorId();
		cout << " == '" << rSec.getClave() << "'" << endl;

		cout << "\nAhora recorro secuencialmente todos los datos del árbol..." << endl;
		string claveAnterior;
		do {
			cout << "-> " << rSec.getClave() << endl;
			claveAnterior = rSec.getClave();
			rSec = tree.proximoRegistroPorId(rSec);

		} while (rSec.getClave() > claveAnterior);

		cout << "\n//-------------------------------//" << endl;

		cout << "\nSe hace la prueba de la impresora" << endl;
		TreePrinter impresora(tree);

		cout << "\nPrimero imprimo los nodos hojas:" << endl;
		impresora.ImprimirDatos();

		cout << "\nDespues imprimo el árbol en pre-orden:" << endl;
		impresora.ImprimirEnPreOrden();

		cout << "\nFin." << endl;
		return 0;

	} catch (std::exception& ex){
		cout << "Excepcion: " << ex.what() << endl;
		return 1;
	}
}

